#ifndef _ENDPOINT_H_
#define _ENDPOINT_H_
#include <stdint.h>

/* 定义音频采样频率 */
#ifndef 	SAMP_FREQ
	#define SAMP_FREQ		16000
#endif
#ifndef M_2PI
	#define M_2PI 			6.283185307179586476925286766559005
#endif

/* 基于能量双门限端点检测法，有效帧和静音帧阈值宏定义 */
#define POINT_THREADHOLD		0.3f
/* 判定起点的连续有效帧数，越小灵敏度越高 */
#define START_NUM_THREADHOLD		2
/* 判定终点的连续静音数，越大越容易规避尾部剪切 */
#define END_NUM_THREADHOLD		15
/* 用于端点检测的帧长，此处应和数据帧长一致 */
#define FRAME_LEN_ENDPOINT		640
/* 一段语音中间间隙静音段的最大帧数，时间长为NUM * 40ms */
#define NUM_START_GAP			4
/* 同NUM_START_GAP */
#define NUM_END_GAP			4

/* 帧类型宏定义，一帧类型可以是起始点、终点、一般帧 */
#define GET_START_POINT			0x01
#define GET_END_POINT			0x02
#define NO_END_START_POINT		0x03

/*
* @brief 端点检测结构体定义
*/

typedef struct  ep_detect_str
{
	uint8_t start_flag;	/* 用于判定是否检测到起始帧 */
	uint8_t end_flag;	/* 用于判定是否检测到终止帧 */
	uint8_t start_num;	/* 当前有效帧数量 */
	uint8_t end_num;	/* 当前终止帧数量 */
	float energy_average;	/* 静音段能量均值 */
}EP_DETECT_STR;

#ifdef __cplusplus
extern    "C"
{
#endif
/*
 * @brief 计算一帧语音的能量值
 * @param data 一帧音频数据
 * @return 该帧能量值
 */
float energy_compute(const int16_t *data);
/*
 * @brief 判断一帧数据类型，分为起始帧，终止帧和一般帧
 * @param ep_detect_struct 端点检测结构体
 * @param data 音频数据
 * @return 该帧类型
 */
uint32_t start_endpoint_detection(EP_DETECT_STR *ep_detect_struct,const int16_t *data);

#ifdef __cplusplus
}
#endif

#endif
